// 随机数生成函数
export const randomNum = (min, max) => {
    return Math.floor(Math.random() * (max - min) + min);
};

// 随机颜色生成函数
export const randomColor = (min, max) => {
    const r = randomNum(min, max);
    const g = randomNum(min, max);
    const b = randomNum(min, max);
    return `rgb(${r},${g},${b})`;
};

// 绘制验证码的函数
export const draw = (ctx, width, height, s= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') => {

    // 清除之前的绘制内容
    ctx.clearRect(0, 0, width, height);

    // 生成背景颜色，设置为浅色调（RGB范围在220-240之间）
    ctx.fillStyle = randomColor(220, 240);
    ctx.fillRect(0, 0, width, height);

    // 初始化验证码字符串变量 imgCode
    let imgCode = "";

    // 遍历4次以绘制4个随机字符
    for (let i = 0; i < 4; i++) {
        // 随机选取字符集中的一个字符
        const text = s[randomNum(0, s.length)];

        // 将该字符添加到验证码字符串中
        imgCode += text;

        // 设置随机字体大小（18px - 36px）
        const fontSize = randomNum(18, 36);

        // 设置随机旋转角度（-30度至30度）
        const deg = randomNum(-30, 30);

        // 设置字体样式、大小和颜色
        ctx.font = `${fontSize}px Simhei`;
        ctx.textBaseline = "top";
        ctx.fillStyle = randomColor(80, 150);

        // 保存当前画布状态，以便进行平移、旋转等操作而不影响后续绘制
        ctx.save();

        // 对每个字符进行坐标平移，并根据旋转角度进行旋转
        ctx.translate(16 * i + 15, 15);
        ctx.rotate((deg * Math.PI) / 180);

        // 在当前位置绘制填充的文本（偏移量防止超出边框）
        ctx.fillText(text, -15 + 5, -15);

        // 恢复之前保存的画布状态，撤销平移和旋转
        ctx.restore();
    }

    // 绘制5条随机干扰线，颜色设置为较浅色系
    for (let i = 0; i < 5; i++) {
        ctx.beginPath();
        ctx.moveTo(randomNum(0, width), randomNum(0, height));
        ctx.lineTo(randomNum(0, width), randomNum(0, height));
        ctx.strokeStyle = randomColor(180, 230);
        ctx.closePath();
        ctx.stroke();
    }

    // 绘制40个随机位置的小圆点作为干扰元素，颜色同样设置为较浅色系
    for (let i = 0; i < 40; i++) {
        ctx.beginPath();
        ctx.arc(randomNum(0, width), randomNum(0, height), 1, 0, 2 * Math.PI);
        ctx.closePath();
        ctx.fillStyle = randomColor(150, 200);
        ctx.fill();
    }
    // 返回生成的验证码字符串
    return imgCode;
};
